#include "sigset.h"
void PrintPending(sigset_t &pending)
{
    cout << "curr process[" << getpid() << "]pending: ";
    for(int signo=31;signo>=1;signo--)
    {
        if(sigismember(&pending,signo))
        {
            cout << 1;
        }
        else
          {
            cout<< 0;
        }
    }
    cout << "\n";
}
void handler(int signo)
{
    cout << signo << " 号信号已递达！！！" << endl;
    cout << "------------------------------------------" << endl;
    sigset_t pending;//pending: 这是一个信号集变量，用于存储当前挂起的信号
    sigpending(&pending); //获取当前挂起的信号集
    PrintPending(pending); //打印
    cout << "------------------------------------------" << endl;
}
int main()
{
    //0.捕捉2号信号
    signal(2,handler);
    //1.屏蔽2号信号
    sigset_t block_set,old_set; //表示一组信号集
    sigemptyset(&block_set); //block_set信号集存储要阻塞的信号，对其置空
    sigemptyset(&old_set); //old_set信号集存储当前被阻塞的信号，对其置空
    sigaddset(&block_set,SIGINT);//将2号信号存入block_set信号集中

    //1.1设置进入进程的block表中
    sigprocmask(SIG_BLOCK,&block_set,&old_set);//SIG_BLOCK: 表示将 block_set 中的信号添加到当前信号掩码中，即阻塞这些信号
    //sigprocmask检查更改被阻塞的信号集
    //真正修改的就是当前进行的内核block表，完成了对2号信号的屏蔽！
    int cnt=10;
    while (true)
    {
        //2.获取当前进程的pending表
        sigset_t pending;
        sigpending(&pending);

        //3.打印pending信号集
        PrintPending(pending);
        cnt--;

        //4.解除对2号信号的屏蔽
        if(cnt==0)
        {
            cout << "完成对2号信号的屏蔽" << endl;
            sigprocmask(SIG_SETMASK,&old_set,&block_set);
        } 
        sleep(1);
    }
   

}